奇異值分解 Singular Value Decomposition, SVD
SVD 的核心概念
SVD 常被用於降維、壓縮及推薦系統。
SVD 將任何一個矩陣 A 分解為三個特定的矩陣相乘:

- U:左奇異向量。
- Σ (Sigma):奇異值,代表資料在各個維度的重要性(通常由大到小排列)。
- VT:右奇異向量的轉置。
實作矩陣重建與降維
題目:實作 svd_compress(A, k)
功能要求:
- 將輸入矩陣 A 分解。
- 僅保留前 k 個最大的奇異值以達到降維/壓縮效果。
- 回傳重建後的近似矩陣。
答案程式碼:
import numpy as np
def svd_compress(A, k):
# 1. 執行分解:得到 U, s (1D 陣列), Vh (V的轉置)
U, s, Vh = np.linalg.svd(A)
# 2. 降維處理:只取前 k 個組成部分
U_k = U[:, :k] # 取 U 的前 k 欄
s_k = s[:k] # 取前 k 個奇異值
Vh_k = Vh[:k, :] # 取 Vh 的前 k 列
# 3. 建立對角矩陣 Sigma_k
Sigma_k = np.diag(s_k)
# 4. 重建矩陣:A_approx = U_k * Sigma_k * Vh_k
# 使用 np.dot 或 @ 進行矩陣相乘
A_approx = np.dot(U_k, np.dot(Sigma_k, Vh_k))
return A_approx
核心考點解析:
- 分解語法:測驗你是否記得
np.linalg.svd(A),並理解它回傳三個值。 - s 是 1D 陣列:這是最容易犯錯的地方。NumPy 的
s是一維陣列,重建時必須用np.diag(s)將其轉回對角矩陣。 - 降維邏輯:測驗你是否理解奇異值是按大小排列的,取前 k 個即代表保留最重要的資訊。
- 維度對齊:在重建時,必須確保 Uk 的欄數與 Σk 的列數一致,這能檢驗你的矩陣運算基礎。
奇異值的重要性 與 矩陣相乘的維度決定的:
- 資訊重要性(排序): 在 SVD 中,奇異值(Σ)是按照由大到小排列的。前 k 個奇異值代表了資料中最重要的特徵。為了配合這前 k 個最重要的數值,我們必須對應地取 U 的前 k 欄與 VT 的前 k 列。
- 矩陣相乘維度(Math Logic): 為了重組成近似原矩陣的形狀 (m,n),維度必須對齊:
- Uk 的形狀為 (m,k)(取前 k 欄)
- Σk 的形狀為 (k,k)
- VkT 的形狀為 (k,n)(取前 k 列) 這樣相乘 (m×k)⋅(k×k)⋅(k×n) 之後,結果才會回到原來的 (m,n)。
np.diag:
